perm filename BEAMS.F4[MSS,LCS] blob
sn#132712 filedate 1974-11-25 generic text, type T, neo UTF8
00100 C***** BEAMS, MARKS, XNOTE, BAUTO *******
00200 SUBROUTINE BEAMS
00300 COMMON/XRN/RN(2000),IT,POS,RA,NN,JB,RB,A,B,JMP,JK,C,DMAX,
00325 1 UMAX,AA,JMAX,X,Y,BB,RNX(1982)
00362 1 /FRMT/F78F(1),FA1(1),FA5(1),IREAD /ALF/INP(72),ML
00400 COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
00500 COMMON/SCX/RHY(4),JALPHA(19),JX,U,JZ,IRHY,JD,KA,KB,IZ
00600 1 /SC/J,L,MK,ISKP,XMINUS,N,IEXP,LK,NNUM,JJ,JA,DBST,NFLG
00700 1 ,IXX,ISEMI,IQT,VX(50),IAMP,K,KN,M,MODE,IBLA
00800 1 /STF/RSTFAC(8),RSTJC
00900 DIMENSION R(8,100)
01100 EQUIVALENCE (R,RN(3001))
01200 DATA BX/25./,BY/.5/
01300
01400 JAUTO=0
01500 2500 DO 1500 K=1,72
01600 IF(INP(K).EQ.'B')GO TO 22
01700 C B=AUTOMATIC BEAMS.
01800 IF(INP(K).NE.'*')GO TO 1500
01900 15 INP(72)='*'
02000 GO TO 500
02100 1500 CONTINUE
02110 GO TO 500
02200 C ABOVE FOR 2ND LINE OF INPUT.
02300 22 REREAD F78F,A,B
02400 C TYPE '2B' OR '3B' FOR AUTOMATIC BEAMS. (2=DUPLE 3=TRIPLE)
02500 IF(IREAD.NE.0)A=B
02600 A=A/2.
02700 C '2'=1 '3'=1.5
02800 JAUTO=-1
02900 K=0
03000 N=0
03100 J=0
03200 INP(72)='*'
03300 122 K=K+1
03400 L=K
03500 222 C=ABS(V(K))
03600 IF(V(K).GT.0)GO TO 922
03700 1022 N=N+1
03800 C SUBTRACTS NUMB. FOR REST.
03900 IF(C.GE.A)GO TO 1222
04000 1322 L=L+1
04100 GO TO 422
04200 1222 IF(AMOD(C,A).NE.0)GO TO 622
04300 IF(K-L.LE.1)GO TO 522
04400 L=L+1
04500 GO TO 722
04600 922 IF(C.EQ.A)GO TO 522
04700 422 IF(K.EQ.IRHY)GO TO 322
04800 K=K+1
04900 C=C+ABS(V(K))
05000 IF(V(K))GO TO 1022
05100 IF(C.EQ.A)GO TO 722
05200 IF(C.LT.A)GO TO 422
05300 C=AMOD(C,A)
05400 IF(K-L.LE.1)GO TO 622
05500 CALL BAUTO(J,L,K-1,N)
05600 622 L=K
05700 IF(ABS(V(K)).GE.A.OR.C.EQ.0)L=L+1
05800 GO TO 422
05900 722 IF(K.EQ.L)GO TO 522
06000 1722 DO 1422 IT=L,K
06100 1422 IF(V(IT).GE.1)GO TO 1522
06200 C WON'T PUT BEAMS WHERE NOT LOGICAL.
06300 CALL BAUTO(J,L,K,N)
06400 522 IF(K.LT.IRHY)GO TO 122
06500
06600 322 IF(J.EQ.0)RETURN
06700 C NO BEAMS - SO GO BACK.
06800 DO 822 K=J+1,68
06850 C USES ONLY 68 SLOTS IN 'V'
06900 822 V(K)=0
07000 J=0
07100 GO TO 511
07200 1522 IF(IT-1.GT.L)GO TO 1622
07300 1822 L=IT+1
07400 IF(L.LT.K)GO TO 1722
07500 GO TO 522
07600 1622 CALL BAUTO(J,L,IT-1,N)
07700 GO TO 1822
07800 C ALL THIS ↑↑ FOR QUARTERS IN TRIPLE TIME UNITS!
07900
08000 500 REREAD F78F,V
08100 J=0
08200 IF(IREAD.NE.0)J=1
08300 511 J=J+1
08400 N=V(J)
08500 C SKIPS LINE #S.
08600 JMP=1
08700 505 L=0
08800 K=0
08900 POS=-10.
09000 IF(MODE.EQ.3)GO TO 5030
09100 C MODE 3 IS FOR ACCENTS ETC.
09200 IF(N.GT.100)GO TO 161
09300 C IZ=TOTAL # OF NOTES
09400 IZ=IZ+1
09500 R(8,IZ)=0
09600 IT=0
09700 503 IF(N.GT.0)GO TO 5031
09800 IT=-1
09900 POS=-1.3
10000 C -1= SLUR INTO 1ST NOTE.
10100 C RA=10
10200 C SETS POS OF LFT SIDE (-10+9, THEN +2)
10300 GO TO 5060
10400 5031 IF(N.LE.80)GO TO 5030
10500 C 203 WILL BECOME 201 AT 61
10600 POS=202
10700 GO TO 550
10800 C -1=1ST SLUR FROM NO NOTE; 99= LAST, TO NO NOTE
10900 5030 L=L+1
11000 502 K=K+1
11100 IF(R(1,K).NE.1.)GO TO 502
11200 C IS IT A NOTE?
11300 P=R(2,K)
11400 IF(P.EQ.POS)GO TO 502
11500 C SKIPS DBLSTPS
11600 POS=P
11700 506 IF(L.NE.N)GO TO 5030
11800 5060 IF(MODE.EQ.3)GO TO 30
11900 C NOW SLUR STARTS
12000 IF(JMP)GO TO 504
12100 C JMP=-1 MEANS END NOTE OF GROUP
12200 J=J+1
12300 NN=V(J)
12400 MK=N
12500 N=NN
12600 IF(N)N=-N
12700 M=K
12800 JA=2
12900 JB=4
13000 KN=K
13100 IF(IT)GO TO 550
13200 RB=0
13300 IF(MODE.EQ.4)GO TO 550
13400 A=XNOTE(K)
13500 C XNOTE IS AMOD(R(4,K),100.)
13600 C SAVES LEVEL OF 1ST NOTE.
13700 504 RB=2
13800 B=AMOD(R(6,K),1.0)
13900 IF(B.GE.0.5)RB=4.
14000 IF(B.EQ.0.4)RB=6.
14100 C THESE ARE FOR >(.5) AND ∧(.4) ACCENTS
14200 IF(NN)RB=-RB
14300 C DIP IS SET BY PARAM 7. (STEM DIR. IS AUTOMATIC)
14400 550 R(JA,IZ)=POS
14500 R(JB,IZ)=XNOTE(K)+RB
14600 JA=6
14700 JB=5
14800 C MK=# OF 1ST NOTE, N=END NOTE NOW
14900 JMP=-JMP
15000 IF(JMP.GT.0)GO TO 1503
15100 C GO FIND RT. SIDE OF SLUR
15200 IF(N.LE.MK)N=MK+1
15300 C PICKS UP TYPO ERRORS
15400 JK=0
15500 IF(R(7,K).GE.10)JK=-1
15600 C CHECKS FOR DOT AFTER 1ST NOTE -- FOR TIES.
15700 GO TO 503
15800
15900 1503 R(3,IZ)=STAFF
16000 IF(MODE.EQ.4)GO TO 35
16100 R(8,IZ)=-1
16200 R(1,IZ)=8
16300 IF(IT)R(4,IZ)=R(5,IZ)
16400 NN=-NN
16500 C IF NN IS NEG. NOW IT MEANS STEM DOWN.(DIP IS UP!)
16600 IF(MK.EQ.IRHY.OR.N.EQ.1)GO TO 61
16700 IF(((XNOTE(K).NE.A.OR.N-MK.GT.1).AND.IT.GE.0.
16800 1 ).OR.IT)GO TO 60
16900 C .N. WAS .KQ. 12/73
17000 C JUMP IF NOT ADJACENT NOTE AT SAME PITCH AND NOT 1ST OR LAST.
17100 61 C=9
17200 IF(JK)C=12
17300 IF(R(6,IZ)-R(2,IZ)-C*RSTJC)GO TO 65
17400 IF(IT)A=XNOTE(K)
17500 A=A+.7
17600 IF(NN.GT.0)A=A-1.4
17700 C TO RAISE OR LOWER IT .5
17800 R(4,IZ)=A
17900 R(5,IZ)=A
18000 B=-2
18100 IF(JK)B=-3
18200 C JK=-1 WHEN NOTE IS DOTTED.
18300 C THIS PUTS TIE BETWEEN (NOT ABOVE OR BELOW) NTS. NO STEM CHNG.
18400 R(8,IZ)=B
18500 GO TO 65
18600 161 J=J+1
18700 K=V(J)
18800 M=N-100
18900 C THIS WILL DIRECT STEMS ON NOTES M THROUGH K. IF -K,STEMS DN.
19000 NN=K
19100 IF(K)K=-K
19200
19300 C NEXT IS STEM INVERTER
19400 60 JB=1
19500 RB=10.
19600 IF(NN)GO TO 509
19700 C IF NN IS NEG. NOW IT MEANS STEM DOWN.(DIP IS UP!)
19800 RB=-RB
19900 JB=2
20000 509 DO 507 L=M,K
20100 IF(R(1,L).NE.1.)GO TO 507
20200 JA=R(5,L)/10.
20300 IF(JA.EQ.0)GO TO 507
20400 IF(JA.EQ.JB)R(5,L)=R(5,L)+RB
20500 507 CONTINUE
20600 IF(N.GT.100)GO TO 514
20700 C JUMP IF ONLY REVERSING STEMS.
20800 GO TO 200
20900 62 IF(NN)GO TO 64
21000 IF(A.EQ.DMAX)GO TO 65
21100 AA=B-DMAX
21200 GO TO 63
21300 65 AA=0
21400 GO TO 63
21500 64 IF(A.EQ.UMAX)GO TO 65
21600 AA=UMAX-B
21700 63 RA=R(6,IZ)
21800 RB=R(2,IZ)
21900 X=1.+(RA-RB)/BX
22000 IF(AA.GT.0)X=X+AA*BY
22100 IF(NN.GT.0)X=-X
22200 510 R(7,IZ)=X
22300 IF(JB)CALL BMX(RA)
22400 514 J=J+1
22500 1514 N=V(J)
22600 IF(N.NE.0)GO TO 505
22700 IF(J.LT.68)GO TO 514
22800 C SOMETIMES A SLASH IS SEEN AS A 0 (WHEN PRECEDED BY SPACE).
22900 IF(INP(72).EQ.'*')RETURN
23000 IF(IREAD.NE.0)GO TO 3501
23100 CALL TYPE
23200 GO TO 2500
23300 3501 READ(22,2501)J,INP
23350 CC3501 K=INP(1)
23360 CC REREAD 2501,J,INP
23365 C REREAD BECAUSE NEXT LINE WAS ALREADY READ IN SCMSS.
23370 CC IF(K.EQ.INP(1))READ(22,2501)J,INP
23380 C TO READ MORE THAN 2 LINES.
23400 GO TO 2500
23500 C FOR 2ND LINE.
23600 2501 FORMAT(I,72A1)
23700
23800
23900 CC35 RA=AMOD(R(7,KN),10.0)
24000 35 RA=10.
24100 C RA WILL=# OF TAILS, KN=1ST NOTE, K=LAST ('MOD' FOR DOTTED NOTES.)
24200 R(1,IZ)=9
24300 JMAX=0
24400 IF(N-MK.EQ.1)JMAX=-1
24500 DMAX=100.
24600 UMAX=-DMAX
24700 C FOR AUTO. BEAMS
24800
24900 JB=0
25000 DO 2 L=KN,K
25100 CC IF(R(1,L).NE.2)GO TO 12
25200 CC RB=R(5,L)
25300 CC GO TO 112
25400 12 IF(R(1,L).NE.1.OR.R(5,L).LT.10.)GO TO 2
25500 C SKIPS NON-NOTES AND DBLSTPS
25600 RB=R(4,L)
25700 IF(ABS(RB).GE.100)GO TO 2
25800 C SKIPS GRACE NOTES
25900 IF(RB.GT.UMAX)UMAX=RB
26000 IF(RB.LT.DMAX)DMAX=RB
26100 C FOR AUTO. BEAMS
26200 RB=AMOD(R(7,L),10.0)
26300 112 IF(RA.EQ.RB)GO TO 2
26400 JB=-1
26500 C FLAG FOR MIXED NUM. OF BEAMS
26600 IF(RB.LT.RA.AND.RB.NE.0)RA=RB
26700 2 CONTINUE
26800 C ABOVE FINDS SMALLEST # OF TAILS. NEXT FOR HGTS.
26900 C ABOVE IS POS.2
27000 IF(JAUTO.AND.UMAX+DMAX.GE.14)NN=-1
27100 C SETS AUTO. BEAMS' STEM DIRECTION.
27200 X=10
27300 IF(NN)X=20
27400 X=X+RA
27500 C # OF BEAMS. IT'S PUT IN DOWN BELOW 550.
27600 200 A=XNOTE(KN)
27700 C A=NOTE 1.
27800 UMAX=A
27900 DMAX=A
28000 C UP MAX. NOTE #, DOWN MAX. NOTE #.
28100 103 DO 3 M=KN,K
28200 IF(R(1,M).NE.1.OR.ABS(R(4,M)).GE.100)GO TO 3
28300 C SKIPS NON-NOTES
28400 7 Y=R(5,M)
28500 B=XNOTE(M)
28600 33 IF(NN.GT.0.)GO TO 5
28700 C JUMP IF STEM UP
28800 IF(Y.LT.20..AND.Y.GE.10.)R(5,M)=Y+10.
28900 GO TO 55
29000 5 IF(Y.GE.20.)R(5,M)=Y-10.
29100 C STEM UP
29200 55 IF(B.LT.UMAX)GO TO 13
29300 UMAX=B
29400 IF(JMAX.OR.M.EQ.KN.OR.M.EQ.K)GO TO 3
29500 UMAX=UMAX+1
29600 GO TO 3
29700 13 IF(B.GT.DMAX)GO TO 3
29800 DMAX=B
29900 IF(JMAX.OR.M.EQ.KN.OR.M.EQ.K)GO TO 3
30000 DMAX=DMAX-1
30100 3 CONTINUE
30200 C LOOKS FOR LOWER AND HIGHER NOTES THAN NOTE 1.
30300 4 IF(MODE.EQ.5)GO TO 62
30400 AA=A
30500 BB=B
30600 C=1
30700 IF(X.LT.20.)GO TO 48
30800 C JUMP IF STEM IS UP
30900 CALL EXCH(AA,BB)
31000 C=-C
31100 CALL EXCH(UMAX,DMAX)
31200 48 IF(AA.LT.BB)GO TO 45
31300 IF(UMAX.EQ.A)GO TO 46
31400 47 A=UMAX-C
31500 B=A
31600 GO TO 444
31700 46 IF(UMAX.GT.AA)GO TO 47
31800 GO TO 49
31900 45 IF(UMAX.NE.B)GO TO 47
32000 49 A=AA
32100 B=BB
32200 IF(X.GE.20)CALL EXCH(A,B)
32300
32400 444 R(3,IZ)=STAFF
32500 446 IF(ABS(A-B).LE.5)GO TO 14
32550 C=C*5
32600 C LIMITS SLOPE OF BEAM
32700 IF(X.GE.20)GO TO 141
32800 IF(B.GT.A)GO TO 140
32900 142 B=A-C
33000 GO TO 14
33100 141 IF(B.GT.A)GO TO 142
33200 140 A=B-C
33300 14 R(4,IZ)=A
33400 R(5,IZ)=B
33500 C MAKES HORIZONTAL BEAMS IF PATTERN IS UP-DOWN.
33600 R(6,IZ)=R(2,K)
33700 C ABOVE IS POS.2
33800 GO TO 510
33900
34000 C NEXT IS FOR ACCENTS AND OTHER MARKS
34100
34200 30 CALL MARKS(RA)
34300 J=J+1
34400 IF(RA.EQ.99)RA=V(J)
34500 C IF STEM IS DOWN OR THERE ARE NOTES BELOW(DBL STP), POSITION
34600 C OF ACCENT WILL BE INVERTED.
34700 RB=R(6,K)
34800 B=10.
34900 IF(RA.EQ.6)RA=26.
35000 C TEMPORARY CHANGE FOR FERMATA*******
35100 IF(RA.GT.10.)RA=RA/10.
35200 A=ABS(AMOD(RB,1.))
35300 IF(A.EQ.0)GO TO 301
35400 IF(RA.GT.3)GO TO 303
35500 RB=FLOAT(IFIX(RB))
35600 RA=RA+A/10.
35700 C THIS PUTS 2-DIGIT CODE BEFORE 1-DIGIT CODE.
35800 GO TO 301
35900 303 IF(A.LT..3)GO TO 302
36000 B=100.
36100 GO TO 301
36200 302 B=1000.
36300 301 IF(RB.LT.0)RA=-RA
36400 R(6,K)=RB+RA/B
36500 GO TO 514
36600 C USES 4-7,9,11-13 FOR ACC. > FERM. DOT - DNBOW UPBOW HARM.
36700 C NOTE#,ACCENT#/N,A/N,A*
36800 END
36900
37000 FUNCTION XNOTE(J)
37100 COMMON/XRN/RN(4000)
37200 DIMENSION R(8,100)
37300 EQUIVALENCE (R,RN(3001))
37400 XNOTE=AMOD(R(4,J),100.)
37500 END
37600
37700 SUBROUTINE BAUTO(J,L,K,N)
37800 C FOR AUTOMATIC BEAMS.
37900 COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
38000 J=J+2
38100 V(J-1)=L-N
38200 V(J)=K-N
38300 END